/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

package controladores;

import controladores.exceptions.NonexistentEntityException;
import controladores.exceptions.PreexistingEntityException;
import entidades.Items;
import javax.persistence.EntityManager;
import javax.persistence.EntityManagerFactory;
import javax.persistence.Persistence;
import javax.persistence.Query;
import javax.persistence.EntityNotFoundException;
import javax.persistence.criteria.CriteriaQuery;
import javax.persistence.criteria.Root;
import entidades.Programacion;
import entidades.Persona;
import entidades.Actividades;
import entidades.Actividadesacademicas;
import java.util.ArrayList;
import java.util.List;

/**
 *
 * @author Andres
 */
public class ItemsJpaController {

    public ItemsJpaController() {
        emf = Persistence.createEntityManagerFactory("proyectoCongresoPU");
    }
    private EntityManagerFactory emf = null;

    public EntityManager getEntityManager() {
        return emf.createEntityManager();
    }

    public void create(Items items) throws PreexistingEntityException, Exception {
        if (items.getActividadesacademicasList() == null) {
            items.setActividadesacademicasList(new ArrayList<Actividadesacademicas>());
        }
        EntityManager em = null;
        try {
            em = getEntityManager();
            em.getTransaction().begin();
            Programacion programacion = items.getProgramacion();
            if (programacion != null) {
                programacion = em.getReference(programacion.getClass(), programacion.getCodigoprogramacion());
                items.setProgramacion(programacion);
            }
            Persona persona = items.getPersona();
            if (persona != null) {
                persona = em.getReference(persona.getClass(), persona.getCodigopersona());
                items.setPersona(persona);
            }
            Actividades actividades = items.getActividades();
            if (actividades != null) {
                actividades = em.getReference(actividades.getClass(), actividades.getCodigo());
                items.setActividades(actividades);
            }
            List<Actividadesacademicas> attachedActividadesacademicasList = new ArrayList<Actividadesacademicas>();
            for (Actividadesacademicas actividadesacademicasListActividadesacademicasToAttach : items.getActividadesacademicasList()) {
                actividadesacademicasListActividadesacademicasToAttach = em.getReference(actividadesacademicasListActividadesacademicasToAttach.getClass(), actividadesacademicasListActividadesacademicasToAttach.getActividadesCodigo());
                attachedActividadesacademicasList.add(actividadesacademicasListActividadesacademicasToAttach);
            }
            items.setActividadesacademicasList(attachedActividadesacademicasList);
            em.persist(items);
            if (programacion != null) {
                programacion.getItemsList().add(items);
                programacion = em.merge(programacion);
            }
            if (persona != null) {
                persona.getItemsList().add(items);
                persona = em.merge(persona);
            }
            if (actividades != null) {
                actividades.getItemsList().add(items);
                actividades = em.merge(actividades);
            }
            for (Actividadesacademicas actividadesacademicasListActividadesacademicas : items.getActividadesacademicasList()) {
                Items oldItemsOfActividadesacademicasListActividadesacademicas = actividadesacademicasListActividadesacademicas.getItems();
                actividadesacademicasListActividadesacademicas.setItems(items);
                actividadesacademicasListActividadesacademicas = em.merge(actividadesacademicasListActividadesacademicas);
                if (oldItemsOfActividadesacademicasListActividadesacademicas != null) {
                    oldItemsOfActividadesacademicasListActividadesacademicas.getActividadesacademicasList().remove(actividadesacademicasListActividadesacademicas);
                    oldItemsOfActividadesacademicasListActividadesacademicas = em.merge(oldItemsOfActividadesacademicasListActividadesacademicas);
                }
            }
            em.getTransaction().commit();
        } catch (Exception ex) {
            if (findItems(items.getIditem()) != null) {
                throw new PreexistingEntityException("Items " + items + " already exists.", ex);
            }
            throw ex;
        } finally {
            if (em != null) {
                em.close();
            }
        }
    }

    public void edit(Items items) throws NonexistentEntityException, Exception {
        EntityManager em = null;
        try {
            em = getEntityManager();
            em.getTransaction().begin();
            Items persistentItems = em.find(Items.class, items.getIditem());
            Programacion programacionOld = persistentItems.getProgramacion();
            Programacion programacionNew = items.getProgramacion();
            Persona personaOld = persistentItems.getPersona();
            Persona personaNew = items.getPersona();
            Actividades actividadesOld = persistentItems.getActividades();
            Actividades actividadesNew = items.getActividades();
            List<Actividadesacademicas> actividadesacademicasListOld = persistentItems.getActividadesacademicasList();
            List<Actividadesacademicas> actividadesacademicasListNew = items.getActividadesacademicasList();
            if (programacionNew != null) {
                programacionNew = em.getReference(programacionNew.getClass(), programacionNew.getCodigoprogramacion());
                items.setProgramacion(programacionNew);
            }
            if (personaNew != null) {
                personaNew = em.getReference(personaNew.getClass(), personaNew.getCodigopersona());
                items.setPersona(personaNew);
            }
            if (actividadesNew != null) {
                actividadesNew = em.getReference(actividadesNew.getClass(), actividadesNew.getCodigo());
                items.setActividades(actividadesNew);
            }
            List<Actividadesacademicas> attachedActividadesacademicasListNew = new ArrayList<Actividadesacademicas>();
            for (Actividadesacademicas actividadesacademicasListNewActividadesacademicasToAttach : actividadesacademicasListNew) {
                actividadesacademicasListNewActividadesacademicasToAttach = em.getReference(actividadesacademicasListNewActividadesacademicasToAttach.getClass(), actividadesacademicasListNewActividadesacademicasToAttach.getActividadesCodigo());
                attachedActividadesacademicasListNew.add(actividadesacademicasListNewActividadesacademicasToAttach);
            }
            actividadesacademicasListNew = attachedActividadesacademicasListNew;
            items.setActividadesacademicasList(actividadesacademicasListNew);
            items = em.merge(items);
            if (programacionOld != null && !programacionOld.equals(programacionNew)) {
                programacionOld.getItemsList().remove(items);
                programacionOld = em.merge(programacionOld);
            }
            if (programacionNew != null && !programacionNew.equals(programacionOld)) {
                programacionNew.getItemsList().add(items);
                programacionNew = em.merge(programacionNew);
            }
            if (personaOld != null && !personaOld.equals(personaNew)) {
                personaOld.getItemsList().remove(items);
                personaOld = em.merge(personaOld);
            }
            if (personaNew != null && !personaNew.equals(personaOld)) {
                personaNew.getItemsList().add(items);
                personaNew = em.merge(personaNew);
            }
            if (actividadesOld != null && !actividadesOld.equals(actividadesNew)) {
                actividadesOld.getItemsList().remove(items);
                actividadesOld = em.merge(actividadesOld);
            }
            if (actividadesNew != null && !actividadesNew.equals(actividadesOld)) {
                actividadesNew.getItemsList().add(items);
                actividadesNew = em.merge(actividadesNew);
            }
            for (Actividadesacademicas actividadesacademicasListOldActividadesacademicas : actividadesacademicasListOld) {
                if (!actividadesacademicasListNew.contains(actividadesacademicasListOldActividadesacademicas)) {
                    actividadesacademicasListOldActividadesacademicas.setItems(null);
                    actividadesacademicasListOldActividadesacademicas = em.merge(actividadesacademicasListOldActividadesacademicas);
                }
            }
            for (Actividadesacademicas actividadesacademicasListNewActividadesacademicas : actividadesacademicasListNew) {
                if (!actividadesacademicasListOld.contains(actividadesacademicasListNewActividadesacademicas)) {
                    Items oldItemsOfActividadesacademicasListNewActividadesacademicas = actividadesacademicasListNewActividadesacademicas.getItems();
                    actividadesacademicasListNewActividadesacademicas.setItems(items);
                    actividadesacademicasListNewActividadesacademicas = em.merge(actividadesacademicasListNewActividadesacademicas);
                    if (oldItemsOfActividadesacademicasListNewActividadesacademicas != null && !oldItemsOfActividadesacademicasListNewActividadesacademicas.equals(items)) {
                        oldItemsOfActividadesacademicasListNewActividadesacademicas.getActividadesacademicasList().remove(actividadesacademicasListNewActividadesacademicas);
                        oldItemsOfActividadesacademicasListNewActividadesacademicas = em.merge(oldItemsOfActividadesacademicasListNewActividadesacademicas);
                    }
                }
            }
            em.getTransaction().commit();
        } catch (Exception ex) {
            String msg = ex.getLocalizedMessage();
            if (msg == null || msg.length() == 0) {
                Integer id = items.getIditem();
                if (findItems(id) == null) {
                    throw new NonexistentEntityException("The items with id " + id + " no longer exists.");
                }
            }
            throw ex;
        } finally {
            if (em != null) {
                em.close();
            }
        }
    }

    public void destroy(Integer id) throws NonexistentEntityException {
        EntityManager em = null;
        try {
            em = getEntityManager();
            em.getTransaction().begin();
            Items items;
            try {
                items = em.getReference(Items.class, id);
                items.getIditem();
            } catch (EntityNotFoundException enfe) {
                throw new NonexistentEntityException("The items with id " + id + " no longer exists.", enfe);
            }
            Programacion programacion = items.getProgramacion();
            if (programacion != null) {
                programacion.getItemsList().remove(items);
                programacion = em.merge(programacion);
            }
            Persona persona = items.getPersona();
            if (persona != null) {
                persona.getItemsList().remove(items);
                persona = em.merge(persona);
            }
            Actividades actividades = items.getActividades();
            if (actividades != null) {
                actividades.getItemsList().remove(items);
                actividades = em.merge(actividades);
            }
            List<Actividadesacademicas> actividadesacademicasList = items.getActividadesacademicasList();
            for (Actividadesacademicas actividadesacademicasListActividadesacademicas : actividadesacademicasList) {
                actividadesacademicasListActividadesacademicas.setItems(null);
                actividadesacademicasListActividadesacademicas = em.merge(actividadesacademicasListActividadesacademicas);
            }
            em.remove(items);
            em.getTransaction().commit();
        } finally {
            if (em != null) {
                em.close();
            }
        }
    }

    public List<Items> findItemsEntities() {
        return findItemsEntities(true, -1, -1);
    }

    public List<Items> findItemsEntities(int maxResults, int firstResult) {
        return findItemsEntities(false, maxResults, firstResult);
    }

    private List<Items> findItemsEntities(boolean all, int maxResults, int firstResult) {
        EntityManager em = getEntityManager();
        try {
            CriteriaQuery cq = em.getCriteriaBuilder().createQuery();
            cq.select(cq.from(Items.class));
            Query q = em.createQuery(cq);
            if (!all) {
                q.setMaxResults(maxResults);
                q.setFirstResult(firstResult);
            }
            return q.getResultList();
        } finally {
            em.close();
        }
    }

    public Items findItems(Integer id) {
        EntityManager em = getEntityManager();
        try {
            return em.find(Items.class, id);
        } finally {
            em.close();
        }
    }

    public int getItemsCount() {
        EntityManager em = getEntityManager();
        try {
            CriteriaQuery cq = em.getCriteriaBuilder().createQuery();
            Root<Items> rt = cq.from(Items.class);
            cq.select(em.getCriteriaBuilder().count(rt));
            Query q = em.createQuery(cq);
            return ((Long) q.getSingleResult()).intValue();
        } finally {
            em.close();
        }
    }

}
